//备注：拷贝代码请加上作者信息
//作者：王海涛
//邮箱：1126471088@qq.com
//版本：V1.0.0
/********************************************************
    说明：
    1、支持内部时钟和外部时钟源。
    2、支持秒中断、闹钟中断、计数器溢出中断。
    3、支持检测上次配置是否被清掉。
    4、支持动态配置闹钟时间、动态配置当前时间。
    5、提供系统32位计数器值，不提供万年历功能。
    6、万年历属于APP范畴，后期在提供或不提供。
    7、基于stm32f4xx标准库V1.9.0
**********************************************************/

#ifndef __RTC_BSP_H__
#define __RTC_BSP_H__

/*****************************************************/
#include "gd32f4xx.h"
#include "gd32f4xx_rtc.h"
#include "gd32f4xx_pwr.h"
#include "gd32f4xx_misc.h"
/*****************************************************/

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

/* 如果定义了下面这个宏的话,PC13就会输出频率为RTC Clock/64的时钟 */
//#define RTCClockOutput_Enable  /* RTC Clock/64 is output on tamper pin(PC13  RTC_AF1) */

/*RTC时钟源枚举*/
typedef enum
{
    NO_Clk          = 0,                          //无时钟源
    LSE_OSC_32768Hz = RCC_RTCCLKSource_LSE,       //外部32768hz
    LSI_RC_40000Hz  = RCC_RTCCLKSource_LSI,       //内部40000hz  //IWDG的40khz好像未等待稳定
    HSE_OSC_Div32  = RCC_RTCCLKSource_HSE_Div31, //外部晶振最高输入进来4Mhz，32分频
}WHT_RTC_Clk_enum;

/*RTC运行状态枚举*/
typedef enum
{
    RTC_Running_Well = 0,//运行正常
    RTC_Running_Stop = 1,//运行停止
}WHT_RTC_State_enum;

/*万年历时间结构体*/
typedef struct
{
    unsigned short Year;//年，必须大于2000
    unsigned char Month;//月
    unsigned char Mday; //日
    unsigned char Hour; //时
    unsigned char Min;  //分
    unsigned char Sec;  //秒
    unsigned char Wday; //星期
}WHT_RTC_Calendar_t;

/*RTC中断回调结构体*/
typedef struct
{
    void (*Alarm_A_Interrupt_Callback)(void);   //闹钟A回调函数
    void (*Alarm_B_Interrupt_Callback)(void);   //闹钟B回调函数
    void (*Wakeup_Interrupt_Callback)(void);    //唤醒回调函数
    void (*Time_Stamp_Interrupt_Callback)(void);//纂改回调函数
    void (*Tamper_Interrupt_Callback)(void);    //入侵回调函数
}WHT_RTC_IT_CB_t;

/*RTC回调函数结构体*/
typedef struct
{
    /*获取当前RTC运行状态 如果返回RTC_Running_Well没必要重新设置*/
    WHT_RTC_State_enum (*WHT_Get_State)(WHT_RTC_Clk_enum clk_source, const WHT_RTC_IT_CB_t* it_cb);
    WHT_RTC_Clk_enum (*WHT_Get_Clock_Source)(void);           //获取当前RTC时钟源
    void (*WHT_Set_Clock_Source)(WHT_RTC_Clk_enum clk_source, const WHT_RTC_IT_CB_t* it_cb);//当使用LSE_OSC_32768Hz如果LSE异常默认自动切换到LSI_RC_40000Hz
    void (*WHT_Set_Time)(const WHT_RTC_Calendar_t* calendar); //设置RTC时间
    void (*WHT_Get_Time)(WHT_RTC_Calendar_t* calendar);       //获取RTC时间
    void (*WHT_Set_Alarm_A)(const WHT_RTC_Calendar_t* alarm); //设置闹钟A 只比较时分秒
    void (*WHT_Set_Alarm_B)(const WHT_RTC_Calendar_t* alarm); //设置闹钟B 只比较时分秒
}WHT_RTC_BSP_t;

/*全局常量*/
extern const WHT_RTC_BSP_t WHT_RTC_BSP;

#endif /*__RTC_BSP_H__*/
